<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    "use strict";

    // JS是弱类型的语言 -> 设计之初存在很多不严谨 不合理 不安全的地方


    // ES5 => 严格模式
    // 1. 解决设计之初存在很多不严谨 不合理 不安全的地方
    // 2. 为未来版本做铺垫
    // 3. 提高代码的执行效率

    // 如何进入严格模式?
    // 在作用域最前面 添加 "use strict";
    // 全局作用域 => 当前脚本的最前面添加  "use strict"
    // 函数作用域 => 函数的最前面 "use strict"

    // function fn() {
    //     "use strict";
    //     var a = 10;
    //     b = 20;
    //     console.log(a, b);
    // }
    // fn();


    // 严格模式中 => 不通过关键词 直接声明的变量 报错
    // var a = 10;
    // b = 20;
    // console.log(a, b);


    // 严格模式中 => 函数的形参重复声明会报错
    // function add(a, b, b) {
    //     // a=1;
    //     // b=2;
    //     // b=3;
    //     console.log(a, b);
    //     return a + b;
    // }
    // var result = add(1, 2, 3);
    // console.log(result);


    // 严格模式中  函数调用时要有依存的对象 => 如果没有依存的对象 this->undefined
    // function fn() {
    //     console.log(this);
    // }
    // fn();  // 函数调用时没有依存的对象
    // window.fn();  // 函数调用时有依存的对象

    // function fn() {
    //     console.log(this);
    //     function a() {
    //         console.log(this);
    //     }
    //     a();
    // }
    // fn();

    // eval()  传入一个字符串,将传入的字符串作为JS语句执行

    // 严格模式中 新增eval作用域 => eval作用域声明的变量也是局部的
    // eval("alert(1111)");
    // eval("var a=1,b=2,c=a+b;console.log(a,b,c)");
    // console.log(a, b, c);

    // 严格模式中 如果对象的属性不允许删除 强制删除会报错
    // 可以删
    var obj = {
        name: "张三",
        age: 18,
        height: "180cm",
        weight: "80kg",
    }
    console.log(delete obj.height);;
    console.log(delete obj.weight);;
    console.log(obj);

    // 不给删
    var a = 10;
    var b = 20;
    console.log(delete window.a);
    console.log(delete window.b);
    console.log(window.a, window.b);




</script>

</html>